/**
 *	@file	marker.c
 *	@brief	マップマーカーセーブデータ 制御
 *	@author	Miyuki Iwasawa
 *	@date	07.08.03
 */

#include "common.h"
#include "savedata/savedata.h"

#define __MARKER_UTIL_H_GLOBAL
#include "savedata/marker_util.h"
#include "savedata/marker_local.h"
#include "fielddata/maptable/zone_id.h"

/**
 *	@brief	マーカーデータサイズ取得
 */
int MarkerData_GetWorkSize(void)
{
	return sizeof(MARKER_DATA);
}

/**
 *	@brief	マーカーブロックデータサイズ取得
 */
int MarkerBlockData_GetWorkSize(void)
{
	return sizeof(MARKER_BLOCK);
}

/*
 *	@brief	そのマーカーデータが有効かどうか？
 */
BOOL MarkerData_IsEnable(MARKER_DATA* dat)
{
	if(	dat->zone <= ZONE_ID_EVERYWHERE ||
		dat->zone >= ZONE_ID_MAX){
		return FALSE;
	}
	return TRUE;
}

/*
 *	@brief	マーカーデータクリア
 */
void MarkerData_Clear(MARKER_DATA* dat)
{
	int i;

	dat->zone = ZONE_ID_EVERYWHERE;
	dat->icon1 = MARKER_ICON_NULL;
	dat->icon2 = MARKER_ICON_NULL;
	dat->icon3 = MARKER_ICON_NULL;
	dat->icon4 = MARKER_ICON_NULL;

	for(i = 0;i < MARKER_PARAM_NUM;i++){
		dat->word[i] = PMS_WORD_NULL;
	}
}

/**
 *	@brief	マーカーデータワーク作成
 */
MARKER_DATA* MarkerData_AllockWork(int heapID)
{
	MARKER_DATA* dat;
	dat = sys_AllocMemoryLo(heapID,sizeof(MARKER_DATA));
	MarkerData_Clear(dat );
	return dat;
}

/**
 *	@brief	マーカーデータコピー
 */
void MarkerData_Copy(MARKER_DATA* src,MARKER_DATA* dest)
{
	*dest = *src;
}


//=================================================================
// マーカーワーク操作系
//=================================================================

/**
 *	@brief	マーカーワーク構造体をクリア
 */
void MarkerDataWk_Clear(MARKER_DATA_WK* wk)
{
	int i;
	wk->zone = ZONE_ID_EVERYWHERE;

	for(i = 0;i < MARKER_PARAM_NUM;i++){
		wk->icon[i] = MARKER_ICON_NULL;
		wk->word[i] = PMS_WORD_NULL;
	}
}

/**
 *	@brief	マーカーワークのzone以外のパラメータが有効かどうか？
 *
 *	@retval TRUE : 有効なパラメータある
 *	@retval FALSE : 有効なパラメータがない
 */
int MarkerDataWk_IsParamEnable(MARKER_DATA_WK* wk)
{
	int i;
	for(i = 0;i < MARKER_PARAM_NUM;i++){
		if(	wk->icon[i] != MARKER_ICON_NULL ||
			wk->word[i] != PMS_WORD_NULL){
			return TRUE;
		}
	}
	//有効なパラメータがない
	wk->zone = ZONE_ID_EVERYWHERE;
	return FALSE;
}

/**
 *	@brief	ワーク構造体型からマーカー構造体型にコピー
 */
static void MarkerDataWk_Copy2Data(MARKER_DATA_WK* src,MARKER_DATA* dest)
{
	int i;

	dest->zone = src->zone;
	dest->icon1 = (src->icon[0]&0x0F);
	dest->icon2 = (src->icon[1]&0x0F);
	dest->icon3 = (src->icon[2]&0x0F);
	dest->icon4 = (src->icon[3]&0x0F);

	for(i = 0;i < MARKER_PARAM_NUM;i++){
		dest->word[i] = src->word[i];
	}
}

/**
 *	@brief	マーカー構造体型からワーク構造体型にコピー
 */
static void MarkerData_Copy2Work(MARKER_DATA* src,MARKER_DATA_WK* dest)
{
	int i;

	dest->zone = src->zone;
	dest->icon[0] = src->icon1;
	dest->icon[1] = src->icon2;
	dest->icon[2] = src->icon3;
	dest->icon[3] = src->icon4;
	for(i = 0;i < MARKER_PARAM_NUM;i++){
		dest->word[i] = src->word[i];
	}
}

//=================================================================
// マーカーセーブデータブロックアクセス系
//=================================================================

/**
 *	@brief	マーカーブロックデータクリア
 */
void MarkerBlock_Clear(MARKER_BLOCK* pb)
{
	int i;

	for(i = 0;i < MARKER_STOCK_MAX;i++){
		MarkerData_Clear(&(pb->marker[i]));
	}
}

/**
 *	@brief	指定したindexのデータが有効かどうか？
 */
BOOL MarkerBlock_IsMarkDataEnable(MARKER_BLOCK* pb,u8 idx)
{
	if(idx >= MARKER_STOCK_MAX){
		return FALSE;	//無効idx
	}
	return MarkerData_IsEnable(&(pb->marker[idx]));
}

/**
 *	@brief	指定したindexのマーカーデータをクリアする
 */
void MarkerBlock_DataClearFromIdx(MARKER_BLOCK* pb,u8 idx)
{
	if(idx >= MARKER_STOCK_MAX){
		return;	//無効idx
	}

	MarkerData_Clear(&(pb->marker[idx]));
}

/**
 *	@brief	指定したindexのマーカーデータをワーク構造体型に取得する
 */
BOOL MarkerBlock_GetWorkFromIdx(MARKER_BLOCK* pb,MARKER_DATA_WK* wk,u8 idx)
{
	if(idx >= MARKER_STOCK_MAX){
		MarkerDataWk_Clear(wk);	//空データを返す
		return FALSE;
	}
	MarkerData_Copy2Work(&(pb->marker[idx]),wk);

	return MarkerData_IsEnable(&(pb->marker[idx]));
}

/**
 *	@brief	指定したindex位置のマーカーデータに
 *			ワーク構造体型で渡されたデータをセットする
 *
 *	@param	pb	ブロックデータへのポインタ
 *	@param	wk	セットしたいパラメータを格納したワーク型へのポインタ
 *	@param	idx	セットしたい位置
 *	@param	mode	上書き可ならTRUE,不可ならFALSE
 *
 *	@return TRUE:セットできた、FALSE：セット出来なかった
 */
BOOL MarkerBlock_SetWorkFromIdx(MARKER_BLOCK* pb,MARKER_DATA_WK* wk,u8 idx,u8 mode)
{
	u8 valid;

	if(idx >= MARKER_STOCK_MAX){
		return FALSE;	//indexオーバー
	}

	if(	mode == FALSE &&
		MarkerData_IsEnable(&(pb->marker[idx])) == TRUE){
			return FALSE;	//上書き不可で指定位置にデータがある
		}

	//データセット
	MarkerDataWk_Copy2Data(wk,&(pb->marker[idx]));
	return TRUE;
}